Amazon S3 バージョン数の世代管理ライフサイクル設定をした CloudFormation サンプルテンプレートの紹介
以下のブログで紹介されているライフサイクルで世代管理を実現する「バージョン数の保持」のライフサイクル設定をしたCloudFormationのテンプレートを作成する機会がありました。
ドキュメントを確認したところ似た名前のプロパティが紛らわしかったので合わせて紹介します。
ドキュメント確認
ドキュメントを確認するとNoncurrentVersionExpiration
とNoncurrentVersionExpirationInDays
(末尾にInDaysがあるかないかの違い)の似た名前のプロパティがあります。
AWS::S3::Bucket Rule - AWS CloudFormation
名前が紛らわしいので各プロパティでできることを整理します。
NoncurrentVersionExpiration
: 指定した世代数分は指定した日数経過後、特定のアクション(削除、移行)の対象外にでき、対象外の世代に対して特定のアクションを実行する- 冒頭のブログで紹介されている世代管理の内容はこちらのプロパティです。
NoncurrentVersionExpirationInDays
: 指定した日数経過後、特定のアクション(削除、移行)を実行する- こちらのプロパティは非推奨となっています。
- 世代数保持指定が可能になった
InDays
なしのプロパティがオススメです。
違いがわかったところでNoncurrentVersionExpiration
のプロパティを使ったテンプレートを作ってみます。
S3バケット作成テンプレート
世代管理のバージョン数保持設定が目的なのですが、サンプルテンプレートとして以下のよく使いそうな設定も加えました。
- S3バケットの暗号化(SSE-S3)
- ACL無効
- バージョニング有効
- パブリックアクセス無効
- バケット全体に対してのライフサイクルルール設定
- 未完了なマルチパートアップロード削除
- 世代管理のバージョン数保持
- Intelligent-Tiering ストレージクラスへ移動
AWSTemplateFormatVersion: "2010-09-09" Description: Create S3 Bucket Parameters: ProjectName: Description: Project Name Type: String Default: unnamed Environment: Description: Environment Type: String Default: dev AllowedValues: - prod - dev S3BucketName: Description: Backet Name Type: String Resources: # ------------------------------------------------------------------------------------ # # S3 # ------------------------------------------------------------------------------------ # S3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub ${ProjectName}-${Environment}-${S3BucketName}-${AWS::AccountId} OwnershipControls: # ACL無効化設定 Rules: - ObjectOwnership: "BucketOwnerEnforced" PublicAccessBlockConfiguration: # パブリックアクセスの設定 BlockPublicAcls: True BlockPublicPolicy: True IgnorePublicAcls: True RestrictPublicBuckets: True VersioningConfiguration: # バージョニング設定 Status: Enabled BucketEncryption: # 暗号化設定 ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: "AES256" BucketKeyEnabled: false LifecycleConfiguration: # ライフサイクルルール設定 Rules: - Id: AbortIncompleteMultipartUpload # 未完了なマルチパートアップロードの削除 AbortIncompleteMultipartUpload: DaysAfterInitiation: 7 Status: "Enabled" - Id: NoncurrentVersionExpiration # 世代管理のバージョン数保持 NoncurrentVersionExpiration: NewerNoncurrentVersions: 3 NoncurrentDays: 1 Status: Enabled - Id: IntelligentTiering # Intelligent-Tieringへ移動 Transitions: - TransitionInDays: 14 StorageClass: INTELLIGENT_TIERING Status: Enabled
その他設定補足
ACL無効化
ACL無効できるようになってからCloudFormationでS3バケット作る機会がなかったのでついでに調べて追加しました。
CloudFrontのアクセスログ保存用S3バケットを作成する予定であれば以下のブログもご確認ください。
未完了なマルチパートアップロードのクリーンアップ
長期で残しておく必要性は感じられないので一定期間経過で削除します。
Intelligent-Tiering
オブジェクト数が大量にあったり、一時的にしか保存しないオブジェクトの場合は逆に高くつく可能性もあります。設定するかしないかはS3バケットの利用用途に応じて判断必要になります。
上のブログの後に新しい階層が追加されています。以下のブログもご参考にしてください。
できあがったS3バケットの設定
テンプレートから作成したS3バケットをマネジメントコンソールから確認します。
ACL 無効化
ACL が無効になっていることを確認できました。文字が小さいですね。
編集ボタンをクリックしてもう少しわかりやすい画面も載せておきます。
ライフサイクル設定3種類
ライフサイクルルールは3個追加されています。
今回のテーマだった世代管理を実現した「バージョン数の保持」設定が入っています。設置値の動作検証は冒頭のブログで紹介されております。
未完了なマルチパートアップロードのクリーンアップも設定されています。
Intelligent-Tiering の設定も意図通り入っています。
以上、世代管理を実現した「バージョン数の保持」のCloudFormationテンプレートを作成してみたでした。
おわりに
過去に自分で作成したライフサイクル設定を確認してみるとNoncurrentVersionExpirationInDays
で設定していました。当時はそれでよかったのですが、以前使用していたプロパティが非推奨になっていたので新規でS3バケットを作成するときは以前のテンプレートを使い回さないように気をつけたいです。